//==================================================================
/// sector_list.h
///
/// Created by Davide Pasca - 2009/10/5
/// See the file "license.txt" that comes with this project for
/// copyright info. 
//==================================================================

#ifndef SECTOR_LIST_H
#define SECTOR_LIST_H

/*
//==================================================================
class SectorObj
{
public:
	sprite	*mpSprite;

	SectorObj() :
		mpSprite(NULL)
	{
	}
};
*/

//==================================================================
class SectorDef
{
public:
	sprite	*mpObj;
	int		len;
	int		step;
	int		offX;
	int		angle;
	int		vangle;
	int		lanes;

SectorDef() :
	mpObj	(NULL),
	len		(0),
	step	(0),
	offX	(0),
	angle	(0),
	vangle	(0),
	lanes	(0)
	{
	}
};

//==================================================================
class Sector
{
public:
	sprite	*mpObj;
	int		basePos;
	int		len;
	int		step;
	int		offX;
	int		angle;
	int		vangle;
	int		lanes;

	Sector() :
		mpObj	(NULL),
		basePos	(0),
		len		(0),
		step	(0),
		offX	(0),
		angle	(0),
		vangle	(0),
		lanes	(0)
	{
	}

	Sector( const SectorDef &def ) :
		mpObj	(def.mpObj),
		basePos	(0),
		len		(def.len	),
		step	(def.step	),
		offX	(def.offX	),
		angle	(def.angle	),
		vangle	(def.vangle	),
		lanes	(def.lanes	)
	{
	}
};

//==================================================================
class SectorList
{
public:
	DVec<Sector>		mSectors;
	int					_total_len;

	int					_read_pos;
	int					_read_cnt;

public:
	//==================================================================
	SectorList();

	//==================================================================
	void add( const SectorDef &def );

	//==================================================================
	int get_len( int sector );

	//==================================================================
	int get_base( int sector );

	//==================================================================
	//int []get_params( int sector );

	//==================================================================
	int GetOffX( int sector ) const { return mSectors[sector].offX; }
	int GetAngle( int sector ) const { return mSectors[sector].angle; }
	int GetVAngle( int sector ) const { return mSectors[sector].vangle; }
	int GetLanes( int sector ) const { return mSectors[sector].lanes; }

	//==================================================================
	const sprite *get_object( int sector ) const;
		  sprite *get_object( int sector );

	//==================================================================
	float get_coe( int sector, int pos );

	//==================================================================
	bool is_drawable( int sector, int pos ) const;

	//==================================================================
	bool is_drawable2( int sector, int pos ) const;

	//==================================================================
	void find_reset();

	//==================================================================
	int find_prev( int pos );

	//==================================================================
	int find_next( int pos );

};

//==================================================================
class SectorListIter
{
	const DVec<Sector>	*mpSectors;
	int					_from_sect;

public:
	SectorListIter() :
		mpSectors(NULL),
		_from_sect(0)
	{
	}

	SectorListIter( const SectorList &secList ) :
		mpSectors(NULL),
		_from_sect(0)
	{
		Init( secList );
	}

	void Init( const SectorList &secList )
	{
		mpSectors = &secList.mSectors;
		_from_sect = 0;
	}

	int find_prev( int pos );
	int find_next( int pos );
};


#endif
